﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Library.Data.Security.Encryption;

namespace UnigenReport.Form
{
    public partial class ucAccountEdit : UserControl
    {
        private User refData;
        private UnigenDataContext db;
        private bool action;//True: Add, False: Update

        #region Thiết lập

        public ucAccountEdit()
        {
            InitializeComponent();
            SetEvent();
            action = true;
            cboType.SelectedIndex = 1;
        }

        /// <summary>
        /// Hàm show ra ngoài cho việc update
        /// </summary>
        /// <param name="refData"></param>
        /// <returns></returns>
        public ucAccountEdit ForUpdate(User obj)
        {
            refData = obj;
            action = false;
            return this;
        }

        /// <summary>
        /// Khai báo các sự kiện
        /// </summary>
        private void SetEvent()
        {
            Load += OnLoad;
            this.cboType.SelectedIndexChanged += cboType_SelectedIndexChanged;
            this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
            this.btnSave.Click += new System.EventHandler(this.btnSave_Click);
        }

        /// <summary>
        /// Hàm load form
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnLoad(object sender, EventArgs e)
        {
            //Load default
            SetDefault();
        }
        
        /// <summary>
        /// Thiết lập các giá trị mặc định của form
        /// </summary>
        private void SetDefault()
        {
            //Lấy các nguồn phụ trợ
            cboRole.DataSource = Variables.ListRole;

            //Bind dữ liệu chính
            BindData();
        }

        /// <summary>
        /// Lấy dữ liệu chính
        /// </summary>
        private void BindData()
        {
            try
            {
                //Data bind
                if (refData != null)
                {
                    pnlTitle.Text = "SỬA ĐỔI THÔNG TIN TÀI KHOẢN";
                    cboType.SelectedIndex = refData.Type;
                    txtUserName.Text = refData.UserName;
                    txtFullName.Text = refData.FullName;
                    cboRole.SelectedIndex = refData.RoleID;
                }
                else
                    pnlTitle.Text = "THÊM MỚI TÀI KHOẢN";
            }
            catch (Exception ex)
            {
                Common.ShowErrorMess("BindData - " + ex.Message);
            }
        }

        #endregion

        #region Hàm

        private void Save()
        {
            try
            {
                db = new UnigenDataContext();
                var userName = txtUserName.Text.Trim();
                var pass = txtPassword.Text.Trim();
                var fullName = txtFullName.Text.Trim();
                var type = cboType.SelectedIndex;
                var role = cboRole.SelectedIndex;

                #region Check valid
                if (String.IsNullOrEmpty(userName))
                {
                    Common.ShowNoticeMess("Nhập tên tài khoản!");
                    return;
                } 
                if (action == true && db.Users.Count(p=>p.UserName.Trim() == userName) > 0)
                {
                    Common.ShowNoticeMess("Đã tồn tại tên tài khoản!");
                    return;
                } 
                if (action && String.IsNullOrEmpty(pass))
                {
                    Common.ShowNoticeMess("Nhập mật khẩu!");
                    return;
                }
                #endregion

                var acc = new User();
                if (action)//Thêm mới
                {
                    acc.UserName = userName;
                    acc.Password = MD5Encryptor.Encrypt(userName.ToUpper(), pass);
                    acc.Type = type;
                    acc.RoleID = role;
                    acc.FullName = fullName;

                    //Thêm tài khoản
                    db.Users.InsertOnSubmit(acc);

                    //Xác nhận
                    db.SubmitChanges();
                }
                else
                {
                    //Cập nhật thông tin
                    acc = db.Users.SingleOrDefault(p => p.UserID == refData.UserID);
                    if (acc != null)
                    {
                        acc.UserName = userName;
                        if(!String.IsNullOrEmpty(pass))
                            acc.Password = MD5Encryptor.Encrypt(userName.ToUpper(), pass);
                        acc.Type = type;
                        acc.RoleID = role;
                        acc.FullName = fullName;
                    }

                    //Xóa quyền cũ
                    db.UserRights.DeleteAllOnSubmit(acc.UserRights);
                }

                //Xác nhận
                db.SubmitChanges();

                //Thông báo
                this.ParentForm.DialogResult = DialogResult.OK;
            }
            catch (Exception ex)
            {
                Common.ShowErrorMess("Save - " + ex.Message);
            }
        }        

        #endregion

        #region Sự kiện

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (keyData == Keys.Enter && btnSave.Enabled == true && !btnSave.Focused && !btnCancel.Focused)
            {
                Save();
            }
            if (keyData == Keys.Escape)
            {
                this.ParentForm.DialogResult = DialogResult.Cancel;
            }
            return base.ProcessCmdKey(ref msg, keyData);
        }

        private void cboType_SelectedIndexChanged(object sender, Telerik.WinControls.UI.Data.PositionChangedEventArgs e)
        {
            if (e.Position == 0)
            {
                cboRole.SelectedIndex = cboRole.Items.Count - 1;
                cboRole.Enabled = false;
            }
            else
                cboRole.Enabled = true;
        }
        
        private void btnSave_Click(object sender, EventArgs e)
        {
            Save();
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.ParentForm.DialogResult = DialogResult.Cancel;
        }

        #endregion

    }
}
